<?php

/*
	Question2Answer (c) Gideon Greenspan

	http://www.question2answer.org/

	
	File: qa-include/qa-page-message.php
	Version: See define()s at top of qa-include/qa-base.php
	Description: Controller for private messaging page


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
    header('Location: ../');
    exit;
}

require_once QA_INCLUDE_DIR . 'qa-db-selects.php';
require_once QA_INCLUDE_DIR . 'qa-app-users.php';
require_once QA_INCLUDE_DIR . 'qa-app-format.php';
require_once QA_INCLUDE_DIR . 'qa-app-limits.php';

$handle = qa_request_part(1);
$loginuserid = qa_get_logged_in_userid();


//	Check we have a handle, we're not using Q2A's single-sign on integration and that we're logged in

if (QA_FINAL_EXTERNAL_USERS)
    qa_fatal_error('User accounts are handled by external code');

if (!strlen($handle))
    qa_redirect('users');

if (!isset($loginuserid)) {
    $qa_content = qa_content_prepare();
    $qa_content['error'] = qa_insert_login_links(qa_lang_html('misc/message_must_login'), qa_request());
    return $qa_content;
}


//	Find the user profile and questions and answers for this handle

list($toaccount, $torecent, $fromrecent) = qa_db_select_with_pending(
    qa_db_user_account_selectspec($handle, false),
    qa_db_recent_messages_selectspec($loginuserid, true, $handle, false),
    qa_db_recent_messages_selectspec($handle, false, $loginuserid, true)
);


//	Check the user exists and work out what can and can't be set (if not using single sign-on)

if ((!qa_opt('allow_private_messages')) || (!is_array($toaccount)) || ($toaccount['flags'] & QA_USER_FLAGS_NO_MESSAGES))
    return include QA_INCLUDE_DIR . 'qa-page-not-found.php';


//	Check that we have permission and haven't reached the limit

$errorhtml = null;

switch (qa_user_permit_error(null, QA_LIMIT_MESSAGES)) {
    case 'limit':
        $errorhtml = qa_lang_html('misc/message_limit');
        break;

    case false:
        break;

    default:
        $errorhtml = qa_lang_html('users/no_permission');
        break;
}

if (isset($errorhtml)) {
    $qa_content = qa_content_prepare();
    $qa_content['error'] = $errorhtml;
    return $qa_content;
}


//	Process sending a message to user

$messagesent = (qa_get_state() == 'message-sent');

if (qa_post_text('domessage')) {
    $inmessage = qa_post_text('message');

    if (!qa_check_form_security_code('message-' . $handle, qa_post_text('code')))
        $pageerror = qa_lang_html('misc/form_security_again');

    else {
        if (empty($inmessage))
            $errors['message'] = qa_lang('misc/message_empty');

        if (empty($errors)) {
            require_once QA_INCLUDE_DIR . 'qa-db-messages.php';
            require_once QA_INCLUDE_DIR . 'qa-app-emails.php';

            if (qa_opt('show_message_history'))
                $messageid = qa_db_message_create($loginuserid, $toaccount['userid'], $inmessage, '', false);
            else
                $messageid = null;

            $fromhandle = qa_get_logged_in_handle();
            $canreply = !(qa_get_logged_in_flags() & QA_USER_FLAGS_NO_MESSAGES);

            $more = strtr(qa_lang($canreply ? 'emails/private_message_reply' : 'emails/private_message_info'), array(
                '^f_handle' => $fromhandle,
                '^url' => qa_path_absolute($canreply ? ('message/' . $fromhandle) : ('user/' . $fromhandle)),
            ));

            $subs = array(
                '^message' => $inmessage,
                '^f_handle' => $fromhandle,
                '^f_url' => qa_path_absolute('user/' . $fromhandle),
                '^more' => $more,
                '^a_url' => qa_path_absolute('account'),
            );

            if (qa_send_notification($toaccount['userid'], $toaccount['email'], $toaccount['handle'],
                qa_lang('emails/private_message_subject'), qa_lang('emails/private_message_body'), $subs)
            )
                $messagesent = true;
            else
                $pageerror = qa_lang_html('main/general_error');

            qa_report_event('u_message', $loginuserid, qa_get_logged_in_handle(), qa_cookie_get(), array(
                'userid' => $toaccount['userid'],
                'handle' => $toaccount['handle'],
                'messageid' => $messageid,
                'message' => $inmessage,
            ));

            if ($messagesent && qa_opt('show_message_history')) // show message as part of general history
                qa_redirect(qa_request(), array('state' => 'message-sent'));
        }
    }
}


//	Prepare content for theme

$qa_content = qa_content_prepare();

$qa_content['title'] = qa_lang_html('misc/private_message_title');

$qa_content['error'] = @$pageerror;

$qa_content['form_message'] = array(
    'tags' => 'method="post" action="' . qa_self_html() . '"',

    'style' => 'tall',

    'fields' => array(
        'message' => array(
            'type' => $messagesent ? 'static' : '',
            'label' => qa_lang_html_sub('misc/message_for_x', qa_get_one_user_html($handle, false)),
            'tags' => 'name="message" id="message"',
            'value' => qa_html(@$inmessage, $messagesent),
            'rows' => 8,
            'note' => qa_lang_html_sub('misc/message_explanation', qa_html(qa_opt('site_title'))),
            'error' => qa_html(@$errors['message']),
        ),
    ),

    'buttons' => array(
        'send' => array(
            'tags' => 'onclick="qa_show_waiting_after(this, false);"',
            'label' => qa_lang_html('main/send_button'),
        ),
    ),

    'hidden' => array(
        'domessage' => '1',
        'code' => qa_get_form_security_code('message-' . $handle),
    ),
);

$qa_content['focusid'] = 'message';

if ($messagesent) {
    $qa_content['form_message']['ok'] = qa_lang_html('misc/message_sent');
    unset($qa_content['form_message']['buttons']);

    if (qa_opt('show_message_history'))
        unset($qa_content['form_message']['fields']['message']);
    else {
        unset($qa_content['form_message']['fields']['message']['note']);
        unset($qa_content['form_message']['fields']['message']['label']);
    }
}


//	If relevant, show recent message history

if (qa_opt('show_message_history')) {
    $recent = array_merge($torecent, $fromrecent);

    qa_sort_by($recent, 'created');

    $showmessages = array_slice(array_reverse($recent, true), 0, QA_DB_RETRIEVE_MESSAGES);

    if (count($showmessages)) {
        $qa_content['message_list'] = array(
            'title' => qa_lang_html_sub('misc/message_recent_history', qa_html($toaccount['handle'])),
        );

        $options = qa_message_html_defaults();

        foreach ($showmessages as $message)
            $qa_content['message_list']['messages'][] = qa_message_html_fields($message, $options);
    }
}


$qa_content['raw']['account'] = $toaccount; // for plugin layers to access


return $qa_content;


/*
	Omit PHP closing tag to help avoid accidental output
*/